package com.github.fancyideas.init;

import com.github.fancyideas.security.module.entity.RoleEntity;
import com.github.fancyideas.security.module.entity.UserEntity;
import com.github.fancyideas.security.module.entity.UserRoleEntity;
import com.github.fancyideas.security.module.view.UserRoleView;
import com.github.fancyideas.security.repository.RoleRepo;
import com.github.fancyideas.security.repository.UserRepo;
import com.github.fancyideas.security.repository.UserRoleRepo;
import com.github.fancyideas.security.repository.UserRoleViewRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Component;

@Order(2)
@Component
public class UserInit implements ApplicationRunner {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private RoleRepo roleRepo;

    @Autowired
    private UserRoleViewRepo userRoleViewRepo;

    @Autowired
    private UserRoleRepo userRoleRepo;

    @Override
    public void run(ApplicationArguments args) {
        // 如果没有超级管理员账户，创建它
        UserEntity entityUser = userRepo.findUserByUsername("root");
        if (entityUser == null) {
            entityUser = new UserEntity();
            entityUser.setUsername("root");
            entityUser.setPassword(BCrypt.hashpw("root", BCrypt.gensalt()));
            entityUser = userRepo.save(entityUser);
        }
        // 如果管理员账户没有管理员角色，查找管理员角色，
        // -》如果没有管理员角色，创建管理员角色，并关联管理员账户。
        // -》如果有管理员角色，关联管理员账户。
        UserRoleView userRoleView = userRoleViewRepo.findViewUserRoleByUserId(entityUser.getUserId());
        // 管理员账号没有管理员角色
        if (userRoleView == null) {
            // 查找管理员角色
            RoleEntity selectRoleEntity = roleRepo.findEntityRoleByRoleName("ROLE_ADMIN");
            // 如果没有管理员角色，创建管理员角色，
            RoleEntity roleEntity = new RoleEntity();
            if (selectRoleEntity == null) {
                roleEntity.setRoleName("ROLE_ADMIN");
                roleEntity = roleRepo.save(roleEntity);
            }
            // 关联管理员账户。
            UserRoleEntity entityUserRole = new UserRoleEntity();
            entityUserRole.setRoleId(roleEntity.getRoleId());
            entityUserRole.setUserId(entityUser.getUserId());
            userRoleRepo.save(entityUserRole);
        }
    }
}
